package qgs.ddjdispachingsystem.ddj.wcs;


import qgs.ddjdispachingsystem.ddj.wcs.taskPool.QGSThreadPool;

import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * @Author: 蔡翔
 * @Date: 2019/9/1 7:14
 * @Version 1.0
 */
public class Test {
    public static void main(String[] args) throws Exception {
        int des_layer = 123;
        //1. 调用线程池来执行任务
        /*QGSThreadPool threadPool = new QGSThreadPool();
        Future<?> future = threadPool.getExecutor().submit(new Runnable() {
            // 这里调用线程池，把我要执行的“任务”传到线程池里面去，具体线程怎么分发怎么回收 我不管，我只要把这个任务执行完了就行了。
            // 下面 的run 方法 就是我要执行的“任务”
            @Override
            public void run(){
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("我要关注：已被82年的java");
            }


        });
        Object r = future.get();
        System.out.println("返回："+r);
        threadPool.getExecutor().shutdown();*/

        //2. 调用线程池来执行任务的基础上让任务 有返回值
        //QGSThreadPool threadPool = new QGSThreadPool();
        Future<?> future = QGSThreadPool.executor.submit(new Callable<String>() {
            // 如果想任务有返回值，可以使用 Callable 作为任务定义。
            @Override
            public String call() throws Exception{
                System.out.println(des_layer);
                try {
                    Thread.sleep(20000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                System.out.println("I`m fine,and you?");
                return "我要关注：已被82年的java";
            }
        });

        System.out.println("是否正在执行："+future.isDone());
        // 这个返回值 也是 上面任务执行好了以后再返还给你的。
        Object r = future.get();

        System.out.println("返回："+r);

        //线程池用好了要关闭,调用shutdown方法，那么线程池就停止对外接客了，但是现在正在线程池里面跑的方法会等待它执行完
        QGSThreadPool.executor.shutdown();

        //一般先调用 shutdown 让线程池停止接客，然后调用 awaitTermination 等待正在工作的线程完事。(等4分钟)
        boolean ok = QGSThreadPool.executor.awaitTermination(4, TimeUnit.MINUTES);

    }
}
